﻿#pragma once
#include "protocol.h"
#include "MuEncDec.h"

class ClientProtocol
{
public:
    void handlePacket(BYTE* data);

    void initEncDec(const char* encPath, const char* decPath);

private:
    void handle_0x00(BYTE* data);
    void handle_0x01(BYTE* data);   // npc消息
    void handle_0x02(BYTE* data);   // 悄悄话
    void handle_0x03(BYTE* data);   // CheckSum
    void handle_0x0B(BYTE* data);
    void handle_0x0C(BYTE* data);   // 发送消息给错误的账号
    void handle_0x0D(BYTE* data);   // 系统通知
    void handle_0x0F(BYTE* data);   // 心跳
    void handle_0x10(BYTE* data);   // 游戏对象移动
    void handle_0x11(BYTE* data);
    void handle_0x12(BYTE* data);   // 遇见玩家
    void handle_0x13(BYTE* data);   // 遇见怪物
    void handle_0x14(BYTE* data);   // 游戏对象超出范围，消失
    void handle_0x15(BYTE* data);   // 游戏对象掉血
    void handle_0x16(BYTE* data);   // 杀死怪物,获得经验
    void handle_0x17(BYTE* data);   // 游戏对象死亡
    void handle_0x18(BYTE* data);   // 作出动作
    void handle_0x19(BYTE* data);   // 使用单体技能
    void handle_0x1A(BYTE* data);
    void handle_0x1B(BYTE* data);
    void handle_0x1C(BYTE* data);   // 进入传送门
    void handle_0x1E(BYTE* data);   // 使用范围技能
    void handle_0x1F(BYTE* data);   // 遇见召唤兽
    void handle_0x20(BYTE* data);   // 地上出现物品
    void handle_0x21(BYTE* data);   // 地上物品消失
    void handle_0x22(BYTE* data);   // 添加物品到背包
    void handle_0x23(BYTE* data);   // 丢弃物品
    void handle_0x24(BYTE* data);   // 移动物品
    void handle_0x25(BYTE* data);
    void handle_0x26(BYTE* data);   // 生命值变化
    void handle_0x27(BYTE* data);   // 魔法值变化
    void handle_0x28(BYTE* data);
    void handle_0x29(BYTE* data);
    void handle_0x2A(BYTE* data);   // 使用治疗药水魔法药水
    void handle_0x30(BYTE* data);   // 打开背包
    void handle_0x31(BYTE* data);   // 商店物品
    void handle_0x32(BYTE* data);
    void handle_0x33(BYTE* data);   // 卖出物品
    void handle_0x36(BYTE* data);
    void handle_0x37(BYTE* data);
    void handle_0x38(BYTE* data);
    void handle_0x39(BYTE* data);
    void handle_0x3A(BYTE* data);
    void handle_0x3B(BYTE* data);
    void handle_0x3C(BYTE* data);
    void handle_0x3D(BYTE* data);
    void handle_0x40(BYTE* data);
    void handle_0x41(BYTE* data);   // 组队申请结果
    void handle_0x42(BYTE* data);   // 队伍信息
    void handle_0x43(BYTE* data);   // 退出队伍
    void handle_0x45(BYTE* data);
    void handle_0x50(BYTE* data);
    void handle_0x51(BYTE* data);   // 战盟申请结果
    void handle_0x52(BYTE* data);   // 战盟信息
    void handle_0x53(BYTE* data);
    void handle_0x54(BYTE* data);
    void handle_0x55(BYTE* data);
    void handle_0x56(BYTE* data);
    void handle_0x5A(BYTE* data);
    void handle_0x5B(BYTE* data);
    void handle_0x5C(BYTE* data);
    void handle_0x5D(BYTE* data);
    void handle_0x60(BYTE* data);   // 战盟宣战
    void handle_0x61(BYTE* data);
    void handle_0x62(BYTE* data);
    void handle_0x63(BYTE* data);
    void handle_0x64(BYTE* data);
    void handle_0x81(BYTE* data);
    void handle_0x82(BYTE* data);
    void handle_0x86(BYTE* data);
    void handle_0x87(BYTE* data);
    void handle_0xF1(BYTE* data);
    void handle_0xF3(BYTE* data);
    void handle_0xF4(BYTE* data);

    // 00
    void onPlayerMessage(PMSG_PlayerMessage* playerMessage);

    // 01
    void onNpcMessage(PMSG_NpcMessage* npcMessage);

    // 02
    void onPlayerPrivateMessage(PMSG_PlayerMessage* playerMessage);

    // 0D
    void onSystemNotice(PMSG_SystemNotice* systemNotice);

    // 10
    void onGameObjMove(PMSG_GameObjMove* gameObjMove);

    // 12
    void onMeetThePlayer(PMSG_MeetThePlayer* meetThePlayer);

    // 13
    void onMeetTheMonster(PMSG_MeetTheMonster* meetTheMonster);

    // 14
    void onGameObjOutOfRange(PMSG_GameObjOutOfRange* gameObjOutOfRange);

    // 15
    void onBloodLoss(PMSG_BloodLoss* bloodLoss);

    // 16
    void onKillMonster(PMSG_KillMonster* killMonster);

    // 17
    void onGameObjDeath(WORD gameObjId);

    // 18
    void onGameObjAction(PMSG_GameObjAction* gameObjAction);

    // 19
    void onUseSingleSkill(PMSG_UseSingleSkill* useSingleSkill);

    // 1C
    void onEnterTheGate(PMSG_EnterTheGate* enterTheGate);

    // 1E
    void onUseRangeSkill(PMSG_UseRangeSkill* useRangeSkill);

    // 1F
    void onMeetTheSummon(PMSG_MeetTheSummon* meetTheSummon);

    // 20
    void onItemsOnGround(PMSG_ItemsOnGround* itemsOnGround);

    // 21
    void onItemsLostOnGround(PMSG_ItemsLostOnGround* itemsLostOnGround);

    // 22
    void onAddItemToBag(PMSG_GridItem* gridItem);

    // 23
    void onDiscardItem(PMSG_DiscardItem* discardItem);

    // 24
    void onMoveItem(PMSG_MoveItem* moveItem);

    // 26
    void onLifeChange(PMSG_LifeManaChange* lifeChange);

    // 27
    void onManaChange(PMSG_LifeManaChange* manaChange);

    // 2A
    void onUsePotion(PMSG_UsePotion* usePotion);

    // 30
    void onOpenBag(BYTE n);

    // 31
    void onShopItems(PMSG_ShopItems* shopItems);

    // 33
    void onSellItem(PMSG_SellItem* sellItem);

    // 42
    void onTeamInfo(PMSG_TeamInfo* teamInfo);

    // 52
    void onGuildInfo(PMSG_GuildInfo* guildInfo);

    // f1 00
    void onConnectedGameServer(PMSG_GameObjIdAndVersion* objIdAndVersion);

    // f1 01
    void onLoginResult(int state);

    // f1 02
    void onSceneSelected(int n);

    // f3 00
    void onCharacterList(PMSG_CharacterList* characterList);

    // f3 01
    void onCreateCharacter(PMSG_CreateCharacter_result* createCharacter_result);

    // f3 02
    void onCharacterDel(int state);

    // f3 03
    void onCharacterInfo(PMSG_CharacterInfo* charInfo);

    // f3 04
    void onCharacterRelive(PMSG_CharacterRelive* characterRelive);

    // f3 05
    void onCharacterLevelUp(PMSG_PlayerLevelUp* playerLevelUp);

    // f3 06
    void onCharacterIncAttributePoint(PMSG_IncAttributePoint* incAttributePoint);

    // f3 07 中毒掉血
    void onPoisoningBloodLoss(WORD number);

    // f3 10
    void onCharacterItemData(PMSG_PlayerBagItems* playerBagItems);

    // f3 11
    void onCharacterSkillData(PMSG_PlayerSkillData* playerSkillData);

    // f4 02
    void onServerList(PMSG_ServerList* serverList);

    // f4 03
    void onServerAddr(PMSG_ServerAddr* serverAddr);

private:
    MuEncDec m_encDec;
};

